xen/x86: add allocation success checks.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 9 Mar 2007 18:32:20 +0000 (18:32 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 9 Mar 2007 18:32:20 +0000 (18:32 +0000)
The necessary fix to arch_domain_create() was discovered by Gerd
Hoffmann, but apparently not submitted so far.

Also, adjust two error codes.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/domain.c
xen/arch/x86/domctl.c

index 57fc717915382be61c51476bbce6ef6811d1dba5..eee2c88197da6e08114e8456f519a0f153d8733f 100644 (file)
@@ -457,8 +457,10 @@ int arch_domain_create(struct domain *d)
  fail:
     free_xenheap_page(d->shared_info);
 #ifdef __x86_64__
-    free_domheap_page(virt_to_page(d->arch.mm_perdomain_l2));
-    free_domheap_page(virt_to_page(d->arch.mm_perdomain_l3));
+    if ( d->arch.mm_perdomain_l2 )
+        free_domheap_page(virt_to_page(d->arch.mm_perdomain_l2));
+    if ( d->arch.mm_perdomain_l3 )
+        free_domheap_page(virt_to_page(d->arch.mm_perdomain_l3));
 #endif
     free_xenheap_pages(d->arch.mm_perdomain_pt, pdpt_order);
     return rc;
index d8ca0b0621614833ec17a33e56dc9f774da7863e..00bb202d57de91428f04a0bc8efd6796e5dd8dc6 100644 (file)
@@ -145,6 +145,12 @@ long arch_do_domctl(
         }
 
         arr32 = alloc_xenheap_page();
+        if ( !arr32 )
+        {
+            ret = -ENOMEM;
+            put_domain(d);
+            break;
+        }
  
         ret = 0;
         for ( n = 0; n < num; )
@@ -157,7 +163,7 @@ long arch_do_domctl(
                                         domctl->u.getpageframeinfo2.array,
                                         n, k) )
             {
-                ret = -EINVAL;
+                ret = -EFAULT;
                 break;
             }
      
@@ -201,7 +207,7 @@ long arch_do_domctl(
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
                                       n, arr32, k) )
             {
-                ret = -EINVAL;
+                ret = -EFAULT;
                 break;
             }